#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=1010,M=10010;

struct Ver
{
    int ver,type,dis;
    bool operator>(const Ver& W) const
    {
        return dis>W.dis;
    }
};

int n,m,S,T;
int h[N],w[M],e[M],ne[M],idx;
int dist[N][2],cnt[N][2];
bool st[N][2];

void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

int dijkstra()
{
    memset(dist,0x3f,sizeof dist);
    memset(st,0,sizeof st);
    memset(cnt,0,sizeof cnt);
    dist[S][0]=0,cnt[S][0]=1;
    
    priority_queue<Ver,vector<Ver>,greater<Ver>> heap;
    heap.push({S,0,0});
    while(heap.size())
    {
        auto t=heap.top();
        heap.pop();
        
        int ver=t.ver,type=t.type,dis=t.dis,count=cnt[ver][type];
        if(st[ver][type]) continue;
        st[ver][type]=true;
        for(int i=h[ver];~i;i=ne[i])
        {
            int j=e[i];
            if(dist[j][0]>dis+w[i])
            {
                dist[j][1]=dist[j][0];
                cnt[j][1]=cnt[j][0];
                heap.push({j,1,dist[j][1]});
                dist[j][0]=dis+w[i];
                cnt[j][0]=count;
                heap.push({j,0,dist[j][0]});
            }
            else if(dist[j][0]==dis+w[i]) cnt[j][0]+=count;
            else if(dist[j][1]>dis+w[i])
            {
                dist[j][1]=dis+w[i];
                cnt[j][1]=count;
                heap.push({j,1,dist[j][1]});
            }
            else if(dist[j][1]==dis+w[i]) cnt[j][1]+=count;
        }
    }
    return dist[T][0]+1==dist[T][1]?cnt[T][1]+cnt[T][0]:cnt[T][0];
}

int main()
{
    int cases;
    cin>>cases;
    while(cases--)
    {
        cin>>n>>m;
        memset(h,-1,sizeof h);
        while(m--)
        {
            int a,b,c;
            cin>>a>>b>>c;
            add(a,b,c);
        }
        cin>>S>>T;
        cout<<dijkstra()<<endl;
    }
    return 0;
}
